package com.heima.leetcode.practice;

import java.util.HashMap;

/**
 * @author 勾新杰
 * @version 1.0
 * @description: leetcode 242. 有效的字母异位词
 * @date 2025/3/20 10:37
 */
public class E242 {

    /**
     * <h3>方法一：计数数组</h3>
     *
     * @param s 字符串1
     * @param t 字符串
     * @return true：是字母异位词，false：不是字母异位词
     */
    public boolean isAnagram1(String s, String t) {
        char[] charArray1 = s.toCharArray();
        char[] charArray2 = t.toCharArray();
        int[] count1 = new int[26];
        int[] count2 = new int[26];
        for (char c : charArray1)
            count1[c - 'a']++;
        for (char c : charArray2)
            count2[c - 'a']++;
        for (int i = 0; i < 26; i++)
            if (count1[i] != count2[i])
                return false;
        return true;
    }

    /**
     * <h3>方法二：计数数组，对方法一优化，三次遍历变成两次遍历</h3>
     *
     * @param s 字符串1
     * @param t 字符串
     * @return true：是字母异位词，false：不是字母异位词
     */
    public boolean isAnagram2(String s, String t) {
        // 这里一定要限制字符串长度一定要相等
        if (s.length() != t.length())
            return false;
        char[] charArray1 = s.toCharArray();
        char[] charArray2 = t.toCharArray();
        int[] count = new int[26];
        for (char c : charArray1)
            count[c - 'a']++;
        // 因为两个字符串长度相等，所以第一个字符串如果有一个字符不在第二个字符串中出现，
        // 那么第二个字符串肯定就有一个字符不在字符串1里面出现或者多出现一次，反正相减就会 < 0
        for (char c : charArray2) {
            count[c - 'a']--;
            if (count[c - 'a'] < 0) return false;
        }
        return true;
    }

    /**
     * <h3>方法三：进阶：当是unicode的时候</h3>
     *
     * @param s 字符串1
     * @param t 字符串
     * @return true：是字母异位词，false：不是字母异位词
     */
    public boolean isAnagram3(String s, String t) {
        // 这里一定要限制字符串长度一定要相等
        if (s.length() != t.length())
            return false;
        char[] charArray1 = s.toCharArray();
        char[] charArray2 = t.toCharArray();
        HashMap<Character, Integer> map = new HashMap<>();
        for (char c : charArray1)
            map.compute(c, (k, v) -> v == null ? 1 : v + 1);
        for (char c : charArray2) {
            Integer value = map.compute(c, (k, v) -> v == null ? -1 : v - 1);
            if (value < 0) return false;
        }
        return true;
    }
}
